<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <script>
    // 1. 创建数组的两种方法  访问数组 通过索引
    // let arr = [1,2]
    let arr = Array(1,2)

    // 2. 遍历数组的一些方法
    // forEach  map  some  every  reduce  filter

    // 2.1 forEach方法  返回值是undefined  不改变原数组
    // 参数: item 元素本身 ind 元素索引 arr原数组
    // const arr = ['a', 'b', 'c'];
    // arr.forEach((item,ind,arr)=> console.log(item, ind ,arr))
    // console.log(arr.forEach((item,ind,arr)=> console.log(item, ind ,arr))) // undefined

    // 2.2 map方法 会返回一个新数组 不会改变原数组  新数组由原数组中的每个元素都调用一次提供的函数后的返回值组成。
    // 参数与forEach一样
    // const arr = [11, 7, 9];
    // 案例1 
    // arr.map(item=> item += 2)
    // console.log(arr.map(item=> item +=2)); // 新数组的每个元素是原数组每次调用函数的返回值
    // console.log(arr);  // 原数组未被改变
    // 案例2
    // const res = arr.map((item, ind) => {
    //   if (ind > 1) return item
    // })
    // console.log(res);// und  und  9  返回und的原因:map必须有返回值 没有返回内容时返回 und  当没有return时 都返回und

    // 2.3 every方法  不改变原数组  返回值是布尔值  不会改变原数组
    // 参数1 是一个回调函数 函数里有三个参数 分别和forEach的参数一样
    // 参数2 执行 callback 时使用的 this 值。
    // every方法为数组中的每个元素执行一次callback函数，直到返回false的元素,会立即返回false 若都是每一个元素返回 true，every 就会返回true
    // every 遍历的元素范围在第一次调用 callback 之前就已确定了。在调用 every 之后添加到数组中的元素不会被 callback 访问到
    // 案例
    // const res1 = [12, 33, 4, 10, 7, 16, 20].every(x => x > 15)
    // console.log(res1); // false

    // 2.4 some方法  特性和 every 一致
    // 返回值 是布尔值 数组中有至少一个元素通过回调函数的测试就会返回true；所有元素都没有通过回调函数的测试返回值才会为 false
    // const res2 = [11, 21, 14, 9, 44].some(x => x > 30)
    // console.log(res2); // true

    // 2.5 reduce方法 (累加器) 返回值是回调函数遍历整个数组后的结果  不会改变原数组
    // 参数1 是回调函数(回调函数有两个必需的参数第一个是初始值 第二个是当前元素)
    // 参数2 是计算的初始值

    // 2.5.1 数组累加
    // var arr = [1, 2, 3, 4];
    // var res = arr.reduce((pre, current)=> {
    //   pre.push(current + 10);
    //   return pre;
    // }, []);
    // console.log(res);

    //  2.5.2 对象累加
    // var arr = ["name", "age", 3, 4];
    // var res = arr.reduce((pre, current)=> {
    //   pre[current] = 2;
    //   return pre;
    // }, {});
    // console.log(res); //  {3: 2,4: 2,age: 2,name: 2}

    // 2.5.3 数组去重
    // const arr = [1, 2, 3, 3, 4]
    // const res = arr.reduce((pre, cur) => {
    //   console.log(pre ,pre.indexOf(cur) );
    //   // 原理 reduce 会遍历四次数组
    //   // 第一次: 初始值是[] 赋值给pre cur是1  进入判断 去找索引 结果是-1  那么执行 pre.push(cur)
    //   pre.indexOf(cur) === -1 ? pre.push(cur) : null
    //   return pre
    // }, [])
    // console.log(res);

 
    // 2.6 filter 创建一个新数组  包含通过所提供函数实现的测试的所有元素
    // 一个新的、由通过测试的元素组成的数组，如果没有任何数组元素通过测试，则返回空数组。

    // filter为数组中每个元素调用一个回调函数 并通过回调返回的是true的元素创建一个新数组  
    // callback 被调用时传入三个参数：
    // 元素的值 
    // 元素的索引
    // 被遍历的数组本身

    // filter 不会改变原数组，它返回过滤后的新数组
    
    console.log([11,2,15,24,46,32].filter(item=> item > 25));


    // 2.7 for...of 语句  
    // 在可迭代对象(Array Map Set  String arguments等) 上创建一个循环 为每个不同属性的值执行语句
    // 注意 for...of 只能遍历数组类型的数据 

    // 遍历Map
    // let iterable = new Map([["a", 1], ["b", 2], ["c", 3]]);
    // for (let entry of iterable) {
    //   console.log(entry);
    // }
    // 遍历Set
    // let iterable = new Set([1, 1, 2, 2, 3, 3]);
    // for (let value of iterable) {
    //   console.log(value);
    // }

    // 和 for...of有所不同 得到的是键值  for...in语句用于遍历对象 得到的是索引 是键名

    // 3. at() 接收一个整数并返回该索引 允许输入正数和负数  返回值是元素的索引
    // let arr = [1,2,3,4,5];
    // console.log( arr.at(5)); // und
    // console.log(arr.at(2)); // 3
    // console.log(arr.at(-1)); // 最后一个元素是 -1


    // 4.fill 填充数组  用一个固定值填充一个数组中从起始索引到终止索引内的全部元素
    // 返回值  修改后的数组
    // 第一个参数 填充的值
    // 第二个参数 起始索引默认值0
    // 第三个参数 终止索引 默认值最后一个
    // 左闭右开
    [1, 2, 3, 4, 5].fill("a",2,3);// [1,2,'a',4,5]
    [1, 2, 3].fill(4, 1, 2);      // [1, 4, 3]


    // 5.flat  数组的扁平化 合并多层次的数组   返回值 新数组
    //  flat 默认参数 是1
    // var arr = [1, 2, [3, [4, 5]]];
    // console.log(arr.flat(2)); //合并两层

    // 6.Array.from('伪数组') 把伪数组变为新数组 
    // 函数的arguments

    // 7.Array.of() 创建一个新数组
    // console.log(Array.of(7, 1, 3)) // [7,1,3]
 
    // 8.find 数组中查找某一项   返回数组中满足提供的测试函数的第一个元素的值  否则返回 undefined
    // let arr = [1,2,3,4,5,6];
    // console.log(arr.find(item=>item>4)); // 5  注意返回的是值  findIndex 返回的是索引

    // 9.findIndex  返回数组中满足提供的函数的第一个元素的索引  否则返回 -1
    // let arr = ['theshy' , 'rookie','jackeylove']
    // console.log(arr.findIndex(item=> item ==='theshy')); // 0  返回的是符合的索引值
   
  </script>
</body>

</html>